进程

进程的工作流程

1.当程序运行的时候会产生父进程,并可能fock多个子进程

2.当父进程接收到任务调度的时候,将任务交给派生的子进程处理,子进程会继承父进程属性。

3.子进程在处理任务的时候,父进程会进入等待状态中。

4.子进程处理完成后,会发出信号并执行退出,退出前会唤醒父进程来回收子进程的资源

5.如果子进程在处理任务过程中异常退出终止,父进程就可能没有回收子进程的资源,导致子进程虽然实体已经消失,但仍在内核中的进程表中占据记录(僵尸进程),长期下去会浪费系统资源

6.如果子进程在处理任务过程中,父进程退出或意外终止,则子进程可能未退出,那么子进程就没有父进程来管理了,由系统的system进程管理(孤儿进程)

7.每个父进程叫PPID,子进程叫PID

进程优先级

进程执行时候是排队执行的,需要插队,要调整。

进程重要性高,需要优先多分配CPU。调整优先级。

nice: 调整【程序运行时】的优先级

renice:调整【运行中的进程】的优先级

区别:

nice命令常用于修改未运行的程序再运行时的优先级,

但是对于正在运行的进程,若想要修改优先级,就需要用到renice命令。

内存

清除buff/cache缓存

echo 1 > /proc/sys/vm/drop_caches  #清理页面缓存(page cache)。页面缓存用于缓存文件系统的数据,以提高读写性能。
echo 2 > /proc/sys/vm/drop_caches  #清理 dentries 和 inodes 缓存。dentries 缓存用于存储目录项(即文件路径),inodes 缓存用于存储文件的元数据(如权限、大小等)。

echo 3 > /proc/sys/vm/drop_caches  #清理页面缓存、dentries 和 inodes 缓存。这是最常用的选项,因为它会清空所有类型的缓存。

查看内存使用情况

使用 top 或者 free、vmstat 命令
free -h
              total        used        free      shared  buff/cache   available
Mem:           972M        120M        727M        7.6M        123M        715M
Swap:          2.0G          0B        2.0G
shared 是共享内存的大小,一般系统不会用到,总是 0
buffers/cache 是缓存和缓冲区的大小,buffers 是对原始磁盘块的缓存,cache 是从磁盘读取文件系统里文件的页缓存
available 是新进程可用内存的大小

内存生产排障案例

内存 swap 过高

Swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用。swap 换出,把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。swap 换入,在进程再次访问这些内存的时候,把它们从磁盘读到内存中来

swap 和 内存回收的机制

  • 内存的回收既包括了文件页(内存映射获取磁盘文件的页)又包括了匿名页(进程动态分配的内存)

  • 对文件页的回收,可以直接回收缓存,或者把脏页写回磁盘后再回收

  • 而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存

  • swap 过高会造成严重的性能问题,页失效会导致频繁的页面在内存和磁盘之间交换

  • 一般线上的服务器的内存都很大,可以禁用 swap

  • 可以设置 /proc/sys/vm/min_free_kbytes,来调整系统定期回收内存的阈值,也可以设置 /proc/sys/vm/swappiness,来调整文件页和匿名页的回收倾向

cpu

进程上下文切换:

  • 无法获取资源而导致的自愿上下文切换

  • 被系统强制调度导致的非自愿上下文切换

CPU 使用率

  • 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙

  • 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙

  • 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,说明系统与硬件设备的 I/O 交互时间比较长

  • 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,表明系统发生了大量的中断

怎么排查 CPU 过高问题

先使用 top 命令,查看系统相关指标。如需要按某指标排序则 使用top -o 字段名, -o可以指定排序字段,顺序从大到小

top -o %MEM
top - 15:24:58 up 49 min,  3 users,  load average: 0.36, 0.16, 0.09
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.3 us,  2.7 sy,  0.0 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995456 total,   745644 free,   124492 used,   125320 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   733004 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
   925 root      20   0  574280  19516   6148 S  0.0  2.0   0:00.48 tuned                                                                                   
   655 polkitd   20   0  612240  12220   4752 S  0.0  1.2   0:00.07 polkitd                                                                                 
   657 root      20   0  626676   9208   7036 S  0.0  0.9   0:00.17 NetworkManager                                                                          
  1615 root      20   0  162232   6672   4900 S  0.7  0.7   0:12.43 sshd                                                                                    
   653 root      20   0  168308   5180   3748 S  0.0  0.5   0:00.02 VGAuthService                                                                           
   654 root      20   0  273192   4880   3748 S  0.0  0.5   0:04.19 vmtoolsd                                                                                
   924 root      20   0  113004   4332   3296 S  0.0  0.4   0:00.00 sshd                                                                                    
  1087 postfix   20   0   89980   4120   3112 S  0.0  0.4   0:00.00 qmgr
  • 找到相关进程后,我们则可以使用top -Hp pid或pidstat -t -p pid命令查看进程具体线程使用 CPU 情况,从而找到具体的导致 CPU 高的线程

  • % us 过高,则可以在对应 Java 服务根据线程 ID 查看具体详情,是否存在死循环,或者长时间的阻塞调用。Java 服务可以使用 jstack

  • 如果是 % sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的

  • 如果是 % si 过高,则可能是网络问题导致软中断频率飙高

  • % wa 过高,则是频繁读写磁盘导致的。

cpu生产排障案例

kswapd0 进程占用 CPU 较高

操作系统使用分页机制来管理物理内存。操作系统将磁盘的一部分划出来作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中。由于内存持续不足,这个换页动作持续进行。kswapd0 是虚拟内存管理中负责换页的进程,当服务器内存不足的时候 kswapd0 会执行换页操作,这个换页操作是十分消耗主机 CPU 资源的。如果通过 top 命令发现该进程持续处于非睡眠状态,且运行时间较长,可以初步判定系统在持续的进行换页操作,可以将问题转向内存不足的原因来排查。

kswapd0 进程占用了系统大量 CPU 资源

执行如下命令,查看 kswapd0 进程。top 系统显示类似如下,发现 kswapd0 进程持续处于非睡眠状态,且运行时间较长并持续占用较高 CPU 资源,则通常是由于系统在持续的进行换页操作所致。

null

通过 free 、ps 等指令进一步查询系统及系统内进程的内存占用情况,做进一步排查分析

针对系统当前内存不足的问题,您可以重启一些服务,释放内存

平均负载(load average)

w或者top或者uptime都可以看负载的指标

什么是平均负载:

衡量系统繁忙的一个综合指标,主要是CPU,IO,网络的繁忙程度。工作中非常常用,具体哪个指标繁忙

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。

系统平均负载被定义为在特定时间间隔内【CPU运行队列中的平均进程数】。如果一个进程满足以下条件则其就会位于运行队列中:

1.可运行状态进程:

是指正在被CPU处理或者正在等待CPU处理的进程,

ps命令看到处于R状态的进程。可运行状态: S R 占用cpu

2.不可中断进程:

系统中最常见的是等待硬件设备的I/O响应,

3.ps命令中看到的D 状态进程。

平均负载其实就是【单位时间内的活跃进程数】。

负载不要超过5,是临界点。

2颗单颗4核CPU,共8核,负载就是8*70%=5左右

查看系统的平均负载

uptime  ##或者top等
10:54:52 up 1124 days, 16:31,  6 users,  load average: 3.67, 2.13, 1.79
  • 10:54:52 是当前时间;

  • up 1124 days, 16:31 是系统运行时间;

  • 6 users 则是正在登录用户数。

  • 而最后三个数字依次是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数

  • 当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能

  • 平均负载与 CPU 使用率关系

    • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
    • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
    • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

平均负载生产排障案例

CPU 使用率较低但负载较高

当前 Linux 系统没有业务程序运行。通过 top 命令观察,发现 CPU 很空闲,但是 load average 却非常高,如下图所示。

null

load average 是对 CPU 负载进行评估的,其值越高说明其任务队列越长,处于等待执行的任务越多。出现此种情况时,可能是由于僵死进程导致的。可以通过ps -axjf命令查看是否存在D+状态进程,该状态是指不可中断的睡眠状态。处于该状态的进程无法终止,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。

null

常用命令

ps

a 显示与终端相关的所有进程,包含每个进程的完整路径
x 显示与终端无关的所有进程
u 显示进程的用户信息
-u 显示指定用户的进程信息
-e 显示所有进程
-f 额外显示UID,PPID,C与STIME栏位
f 显示进程数
-H 显示进程数
-l 以详细的格式来显示进程状况

ps -ef 的结果详解:

UID :该进程的UID

PID:进程的标识号

PPID:该进程的父进程标识号

C:cpu使用的资源百分比

STIME :进程开始的时间

TTY :该进程是在哪个终端机上运作,若与终端机无关,则显示?,tty1-tty6则表示是本机上面的登入者进程,pts/0等,则表示为由网络连接进主机的进程。

TIME :进程所使用的总的cpu时间

CMD:正在执行的命令行

ps aus的结果详解:

USER:用户

PID:进程的标识号

%CPU:使用掉的cpu百分比

%MEM:占用的物理内存百分比

VSZ:占用的虚拟内存量(KB)

RSS:占用的物理内存大小

TTY:该进程是在哪个终端机上运作,若与终端机无关,则显示?,tty1-tty6则表示是本机上面的登入者进程,pts/0等,则表示为由网络连接进主机的进程。

STAT:该进程目前的状态,R表示进ps程运行,S表示可中断进程(随时),T表示进程被暂停(挂起),D表示不可中断进程,Z表示僵尸进程。

START:该进程被触发的时间

TIME:进程所使用的总的cpu时间

COMMAND:该进程的实际命令,[方括号]属于内核态的进程,没有[]的属于用户态进程

pstree

以树形结构显示进程和进程之间的关系

-a 显示启动每个进程对应的完整指令,包含启动进程的路径,参数等
-c 不精简显示进程信息,即显示的进程中包含子进程和父进程
-h 对现在执行的程序进行特别标注
-n 根据进程PID号来排序输出,默认是以程序名来排序输出的
-p 显示进程的PID
-u 显示进程对应的用户名称

strace

系统调用:系统为应用程序提供的连接接口

进程执行:调用很多接口。。

strace是Linux环境下的一款程序调试工具,用来检查一个应用程序所使用的系统调用及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行消耗的时间等。

-p pid 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可※

-f 跟踪目标进程,以及目标进程创建的所有子进程※

-tt 在输出中的每一行前加上时间信息,精确到微秒。例子:11:18:59.759546※

小结:strace命令很适合程序僵尸、命令执行报错等的问题,如果从程序日志和系统日志中看不出问题出现的原因,

就可以strace一下,也许有答案,不过也需要使用者有足够的耐心去查看输出!

top

执行top命令后,默认会出现如下内容:

null

top命令输出了很多参数,真正的服务器负载情况我们要综合其他参数一起看,运行结果可以分为两部分:

  • 第一部分是前5行,是系统整体的统计信息;

  • 第二部分是第8行开始的进程信息,我们从上往下逐行依次进行说明。

系统整体的统计信息

第一行

top - 16:20:38 up 12 days,  5:24,  2 users,  load average: 0.04, 0.03, 0.05
  • top:当前时间。

  • up:机器运行了多长时间。

  • users:当前登录用户数。

  • load average:系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

这里具体需要关注的还是load average三个数值。先来说说定义吧:在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。三个数字分别代表了1分钟,5分钟,15分钟的统计值,这个数值的确能反应服务器的负载情况。

但是,这个数值高了也并不能直接代表这台机器的性能有问题,可能是因为正在进行CPU密集型的计算,也有可能是因为I/O问题导致运行队列堵了。所以,当我们看到这个数值飙升的时候,还得具体问题具体分析。

大家都知道,一个CPU在一个时间片里面只能运行一个进程,CPU核数的多少直接影响到这台机器在同时间能运行的进程数。所以一般来说Load Average的数值别超过这台机器的总核数,就基本没啥问题。

第二行

Tasks: 127 total,   1 running, 126 sleeping,   0 stopped,   0 zombie
  • Tasks:当前有多少进程。

  • running:正在运行的进程数。

  • sleeping:正在休眠的进程数。

  • stopped:停止的进程数。

  • zombie:僵尸进程数。

这里running越多,服务器自然压力就越大。

第三行

%Cpu(s):  0.3 us,  0.7 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0si,  0.0 st
  • us:用户空间占CPU的百分比(像shell程序、各种语言的编译器、各种应用、web服务器和各种桌面应用都算是运行在用户地址空间的进程,这些程序如果不是处于idle状态,那么绝大多数的CPU时间都是运行在用户态)。

  • sy:内核空间占CPU的百分比(所有进程要使用的系统资源都是由Linux内核处理的,对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,因此在调查IO相关的问题时需要着重关注它)。

  • ni:用户进程空间改变过优先级(ni是nice的缩写,可以通过nice值调整进程用户态的优先级,这里显示的ni表示调整过nice值的进程消耗掉的CPU时间,如果系统中没有进程被调整过nice值,那么ni就显示为0)。

  • id:空闲CPU占用率。

  • wa:等待输入输出的CPU时间百分比(和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如,CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的)。

  • hi:硬中断占用百分比【硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理(消耗CPU时间)】。

  • si:软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)。

  • st:steal time。

第四行

KiB Mem : 1863012 total, 1286408 free,  216532 used, 360072 buff/cache
  • total:物理内存总量。

  • free:空闲内存量。

  • used:使用的内存量。

  • buffer/cache:用作内核缓存的内存量。

第五行

KiB Swap: 5242876 total, 7999484 free,     0 used. 1468240 avail Mem
  • total:交换区内存总量。

  • free:空闲交换区总量。

  • used:使用的交换区总量。

  • buffer/cache:缓冲的交换区总量。

第四第五行分别是内存信息和swap信息,所有程序的运行都是在内存中进行的,所以内存的性能对与服务器来说非常重要。不过当内存的free变少的时候,其实我们并不需要太紧张。真正需要看的是Swap中的used信息。

Swap分区是由硬盘提供的交换区,当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。

进程信息

PID    USER    PR  NI  VIRT    RES   SHR   S  %CPU  %MEM     TIME+  COMMAND            
21829  root    20   0  0       0     0     S   0.7  0.6   129:53.91  java
22559  root    20   0  158920  5628  4268  S   0.3  9.2   139:42.81  java
22598  root    20   0  162112  2208  1540  S   0.3  0.1   0:04.68    fluentd


PID  进程id
USER  进程所有者的用户名
PR       优先级
NI    nice值,负值表示高优先级,正值表示低优先级
VIRT  进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES    进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR    共享内存大小,单位kb
S    进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU  上次更新到现在的CPU时间占用百分比
%MEM  进程使用的物理内存百分比
TIME+  进程使用的CPU时间总计,单位1/100秒
COMMAND  命令名/命令行

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列,还有一些参数,例如:
PPID  父进程id
GROUP   进程所有者的组名
SWAP:  进程使用的虚拟内存中被换出的大小
CODE  可执行代码占用的物理内存大小,单位kb
DATA  可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
nFLT  页面错误次数
nDRT  最后一次写入到现在,被修改过的页面数。
WCHAN  若该进程在睡眠,则显示睡眠中的系统函数名
Flags  任务标志

top交互命令使用

通过按f键可以编辑显示内容,按f键后,会出现下图

null

根据上图可知:

①当前是按照%CPU这一列来排序的。
②可以通过上、下键来选择。
③按右键可以选择整个列,然后按上、下键来移动整个列的显示位置,前移或后移,按回车确定。
④按空格键来显示或隐藏该列,带*的是显示,不带*的是不显示。
⑤按s键可以将当前列设置为排序列。
⑥按q键退出。
1. 敲top后,按键盘数字“1”可以监控每个逻辑CPU的状况
2. 敲top后,输入u,然后输入用户名,则可以查看相应的用户进程
3. 敲top后,top命令默认以K为单位显示内存大小,我们可以通过大写字母E来切换内存信息区域的显示单位,如下按一下E切换到MB,再按一下E切换到GB
4. 敲top后,输入h进入top命令的帮助文档,了解更多关于top的用法

top常用参数

-d  指定刷新的时间,如希望没秒刷新一次,则使用:top -d 1
-p  通过指定PID来仅仅监控某个进程的状态
-S  指定累计模式
-s  使top命令在安全模式中运行,这将除去交互命令所带来的潜在危险
-H 输出某个特定进程<pid>并检查该进程内运行的线程状况:top -H -p <pid>

lsof

lsof 命令常用于查找进程打开了哪些文件以及与打开文件相关联的内容

常用参数

-p pid : 输出指定进程打开的文件;
-l : 输出中使用ID代替用户名;
-u userName : 输出指定用户打开的文件;
-c string : 输出 COMMAND 列中包含 string 的项;
-d fd : 输出包含指定描述符的项;
fileName : 输出打开文件 fil eName 的所有项;

无参数

lsof
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND     PID   TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                 root  cwd       DIR              253,0       236         64 /
systemd       1                 root  rtd       DIR              253,0       236         64 /
systemd       1                 root  txt       REG              253,0   1616360   67485964 /usr/lib/systemd/systemd
systemd       1                 root  mem       REG              253,0     20112   33750391 /usr/lib64/libuuid.so.1.3.0
systemd       1                 root  mem       REG              253,0    265624   33750457 /usr/lib64/libblkid.so.1.1.0
systemd       1                 root  mem       REG              253,0     90248   33628492 /usr/lib64/libz.so.1.2.7
systemd       1                 root  mem       REG              253,0    157424   33750414 /usr/lib64/liblzma.so.5.2.2
systemd       1                 root  mem       REG              253,0     23968   33750402 /usr/lib64/libcap-ng.so.0.0.0
systemd       1                 root  mem       REG              253,0     19896   33750102 /usr/lib64/libattr.so.1.1.0
systemd       1                 root  mem       REG              253,0     19248   33591164 /usr/lib64/libdl-2.17.so
systemd       1                 root  mem       REG              253,0    402384   33750139 /usr/lib64/libpcre.so.1.2.0
……
……


其中,每列参数的含义如下:
1. COMMAND : 命令名称;
2. PID : 进程ID
3. TID : 线程ID,如果为空代表列出的是进程;
4. TASKCMD : 任务名称,通常与 COMMAND 相同;
5. USER : 用户ID号或登录名;
6. FD : 文件描述符;
7. TYPE : 与文件关联结点的类型;
8. DEVICE : 设备号;
9. SIZE/OFF : 文件大小/偏移量,以字节为单位;
10. NODE : 文件结点;
11. NAME : 文件挂载点和文件所在的系统;

-p 参数

列出 1号 进程打开的文件

lsof -p 1
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd   1 root  cwd       DIR              253,0      236         64 /
systemd   1 root  rtd       DIR              253,0      236         64 /
systemd   1 root  txt       REG              253,0  1616360   67485964 /usr/lib/systemd/systemd
systemd   1 root  mem       REG              253,0    20112   33750391 /usr/lib64/libuuid.so.1.3.0
systemd   1 root  mem       REG              253,0   265624   33750457 /usr/lib64/libblkid.so.1.1.0
systemd   1 root  mem       REG              253,0    90248   33628492 /usr/lib64/libz.so.1.2.7
systemd   1 root  mem       REG              253,0   157424   33750414 /usr/lib64/liblzma.so.5.2.2
systemd   1 root  mem       REG              253,0    23968   33750402 /usr/lib64/libcap-ng.so.0.0.0
systemd   1 root  mem       REG              253,0    19896   33750102 /usr/lib64/libattr.so.1.1.0
systemd   1 root  mem       REG              253,0    19248   33591164 /usr/lib64/libdl-2.17.so
systemd   1 root  mem       REG              253,0   402384   33750139 /usr/lib64/libpcre.so.1.2.0
systemd   1 root  mem       REG              253,0  2156272   33591158 /usr/lib64/libc-2.17.so
systemd   1 root  mem       REG              253,0   142144   33623171 /usr/lib64/libpthread-2.17.so
systemd   1 root  mem       REG              253,0    88720   33591127 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd   1 root  mem       REG              253,0    43712   33623176 /usr/lib64/librt-2.17.so
……

-l 参数

输出中使用用户 ID 代替用户名,如下所示

lsof -l
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND     PID   TID     USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1              0  cwd       DIR              253,0       236         64 /
systemd       1              0  rtd       DIR              253,0       236         64 /
systemd       1              0  txt       REG              253,0   1616360   67485964 /usr/lib/systemd/systemd
systemd       1              0  mem       REG              253,0     20112   33750391 /usr/lib64/libuuid.so.1.3.0
systemd       1              0  mem       REG              253,0    265624   33750457 /usr/lib64/libblkid.so.1.1.0
systemd       1              0  mem       REG              253,0     90248   33628492 /usr/lib64/libz.so.1.2.7
……

例子中,USER 列显示的是用户ID而不是用户名。

-u 参数

执行命令 lsof -u root,输出 root 用户打开的文件,如下所示

lsof -u root
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND     PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1 root  cwd       DIR              253,0       236         64 /
systemd       1 root  rtd       DIR              253,0       236         64 /
systemd       1 root  txt       REG              253,0   1616360   67485964 /usr/lib/systemd/systemd
systemd       1 root  mem       REG              253,0     20112   33750391 /usr/lib64/libuuid.so.1.3.0
systemd       1 root  mem       REG              253,0    265624   33750457 /usr/lib64/libblkid.so.1.1.0
systemd       1 root  mem       REG              253,0     90248   33628492 /usr/lib64/libz.so.1.2.7
……

-c 参数

执行命令 lsof -c sshd,输出 COMMAND 列包含 sshd 的项,如下所示:

lsof -c sshd
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
sshd     9237       root  cwd    DIR              253,0      236        64 /
sshd     9237       root  rtd    DIR              253,0      236        64 /
sshd     9237       root  txt    REG              253,0   853040  35966750 /usr/sbin/sshd
sshd     9237       root  mem    REG              253,0    61560  33617054 /usr/lib64/libnss_files-2.17.so
sshd     9237       root  mem    REG              253,0    68192  33750408 /usr/lib64/libbz2.so.1.0.6
sshd     9237       root  mem    REG              253,0   100008  33750485 /usr/lib64/libelf-0.172.so
sshd     9237       root  mem    REG              253,0    19896  33750102 /usr/lib64/libattr.so.1.1.0
sshd     9237       root  mem    REG              253,0    15688  33750299 /usr/lib64/libkeyutils.so.1.5
sshd     9237       root  mem    REG              253,0    62888  33750374 /usr/lib64/libkrb5support.so.0.1
……

-d 参数

执行命令 lsof -d 12输出打开文件描述符 12 的所有项,如下所示:

lsof -d 12
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND     PID       USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd       1       root   12u     unix 0xffff9e2ab51d6c00      0t0      25988 /run/systemd/private
systemd-j  4392       root   12u  a_inode               0,10        0       7495 [timerfd]
auditd     8686       root   12u  a_inode               0,10        0       7495 [eventfd]
dbus-daem  8724       dbus   12u     unix 0xffff9e2b33fac000      0t0      44865 /run/dbus/system_bus_socket
avahi-dae  8785      avahi   12u     IPv4              54551      0t0        UDP *:mdns
systemd-l  8788       root   12u     unix 0xffff9e2bb62cac00      0t0      48301 socket
NetworkMa  8794       root   12u  netlink                         0t0      52627 KOBJECT_UEVENT
udisksd    8795       root   12u  a_inode               0,10        0       7495 [eventfd]
tuned      9236       root   12u  a_inode               0,10        0       7495 [eventpoll]
……

fileName

查看打开文件/usr/lib64/ld-2.17.so的进程项,如下所示

lsof /usr/lib64/ld-2.17.so
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND     PID           USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
systemd       1           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
systemd-j  4392           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
lvmetad    4417           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
systemd-u  4429           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
auditd     8686           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
audispd    8688           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
sedispatc  8691           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
lsmd       8712 libstoragemgmt mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
rpcbind    8713            rpc mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
abrtd      8715           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
abrt-watc  8716           root mem    REG  253,0   163312 33554510 /usr/lib64/ld-2.17.so
……

-i 参数

执行命令 lsof -i 4,输出 TYPE 为 IPv4 的所有项,如下所示:
lsof -i 4
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd       1       root   41u  IPv4  47143      0t0  TCP *:sunrpc (LISTEN)
systemd       1       root   42u  IPv4  47144      0t0  UDP *:sunrpc
rpcbind    8713        rpc    4u  IPv4  47143      0t0  TCP *:sunrpc (LISTEN)
rpcbind    8713        rpc    5u  IPv4  47144      0t0  UDP *:sunrpc
rpcbind    8713        rpc   10u  IPv4  44332      0t0  UDP *:netconf-beep
avahi-dae  8785      avahi   12u  IPv4  54551      0t0  UDP *:mdns
avahi-dae  8785      avahi   13u  IPv4  54552      0t0  UDP *:36757
chronyd    8893     chrony    1u  IPv4  54530      0t0  UDP localhost:323
sshd       9237       root    3u  IPv4  55748      0t0  TCP *:ssh (LISTEN)
……



执行命令 lsof -i UDP 输出协议类型为 UDP 的所有项,如下所示:
lsof -i UDP
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd       1   root   42u  IPv4  47144      0t0  UDP *:sunrpc
systemd       1   root   45u  IPv6  47146      0t0  UDP *:sunrpc
rpcbind    8713    rpc    5u  IPv4  47144      0t0  UDP *:sunrpc
rpcbind    8713    rpc    7u  IPv6  47146      0t0  UDP *:sunrpc
rpcbind    8713    rpc   10u  IPv4  44332      0t0  UDP *:netconf-beep
rpcbind    8713    rpc   11u  IPv6  44333      0t0  UDP *:netconf-beep
avahi-dae  8785  avahi   12u  IPv4  54551      0t0  UDP *:mdns
avahi-dae  8785  avahi   13u  IPv4  54552      0t0  UDP *:36757
chronyd    8893 chrony    1u  IPv4  54530      0t0  UDP localhost:323
chronyd    8893 chrony    2u  IPv6  54531      0t0  UDP localhost:323
dnsmasq   11383 nobody    3u  IPv4  61779      0t0  UDP *:bootps
dnsmasq   11383 nobody    5u  IPv4  61782      0t0  UDP localhost.localdomain:domain
kubelet   20062   root    5u  IPv4 211268      0t0  UDP localhost.localdomain:43225->gateway:domain
dhclient  25719   root    6u  IPv4 181490      0t0  UDP *:bootpc

vmstat

用法

-V:显示vmstat版本信息。
-n:只在开始时显示一次各字段名称。
-a:显示活跃和非活跃内存
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-s:显示内存相关统计信息及多种系统活动数量。
-m:显示slabinfo
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-f:显示从系统启动至今的fork数量 。

delay:刷新时间间隔。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

每秒采集一次,总共采集10次

vmstat 1 10
procs   -----------memory----------     ---swap-- -----io----   --system--      -----cpu-----
 r  b   swpd   free   buff  cache       si   so    bi    bo     in      cs      us sy id wa st
18  3      0 2470528 277184 26229064    0    0   759     4697    1      1       32  3 64  0  0
15  0      0 2374660 277244 26323800    0    0 10184    107824  45341   29018   75  5 20  0  0
21  2      0 2287116 277312 26411708    0    0 10620    90692   42217   26624   64  5 31  0  0
 9  1      0 2192396 277384 26506400    0    0 32488    74548   40079   25572   60  4 35  0  0
 7  0      0 2074596 277436 26624980    0    0 15112    82340   44721   28915   65  5 30  0  0
 1  0      0 2022268 277480 26675624    0    0 11608    44060   24362   15309   38  3 59  0  0
17  1      0 1951776 277540 26751392    0    0 21120    86144   48276   29168   68  5 27  0  0
 4  0      0 1869224 277600 26832680    0    0 10724    79760   40363   26640   59  5 36  0  0



Procs(进程)
r: 运行队列中等待被运行的进程数量,这个值也可以判断是否需要增加CPU。(长期大于cpu核数)
b: 等待IO的进程数量。


Memory(内存)
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。


Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。


IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。


system(系统)
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。


CPU(以百分比表示)
us: 用户进程执行时间百分比(user time)
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time).sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比

results matching ""

    No results matching ""